AI in Finance<量化交易&人工智能&金融投资>(上) 您所在的位置:网站首页 量化交易 api AI in Finance<量化交易&人工智能&金融投资>(上)

AI in Finance<量化交易&人工智能&金融投资>(上)

2023-03-14 18:07| 来源: 网络整理| 查看: 265

投资有风险,操作需谨慎!!!! 本文为个人笔记,请审核通过,谢谢

不管多么优秀的统计模型都有局限,风险控制永远都要放到第一位! 分散化不要把鸡蛋放在一个篮子里!高抛低吸!

AI in Finance 1 金融基础1.1 金融产品1.1.1 股票1.1.2 基金1.1.3 债券1.1.4 期货1.1.5 期权1.1.6 ETF1.1.7 外汇 1.2 技术指标1.2.1 K线 (日本蜡烛图) 1.2.2 MA、SMA、WMA、EMA1.2.3 MACD指标和KDJ指标1.2.4 BOLL指标 1.3 金融模型 2 量化交易简介2.1 量化交易开发流程2.2 量化交易分类2.2.1 按交易产品分类2.2.2 按盈利模式分类2.2.3 按策略信号分类 2.3 股票投资2.3.1 行业分类的作用2.3.2 股价影响因素2.3.3 量化名词解释2.3.4 财务知识2.3.5 选股2.3.6 择时 2.4 量化平台2.5 量化投资(选股+择时)2.6 从量化角度重新认识指标 3 股价分析基础(Numpy\Pandas\Matpolt)3.1 股价分析指标3.2 股价均线3.3 股票时间序列3.4 K线图3.5 MACD3.6 KDJ指数 4 聚宽量化实战4.1 量化交易策略基本框架4.2 常用下单函数API4.3 读取Context中的数据!!!(重要)4.3.1 Context对象(策略信息)4.3.2 Position对象(持仓信息)4.3.3 Portfolio账户对象(账户信息) 4.3 多股票策略4.4 数据获取4.4.1 Pandas.DataFrame数据格式4.4.2 获取成分股4.4.3 获取行情数据4.4.4 获取财务数据4.4.5 获取标的(产品)信息4.4.6 本地获取聚宽数据-JQData 4.5 策略实战4.6 策略评价4.6.1 回测4.6.2 模拟交易 4.7 投资研究功能 5 经典量化策略(选股)5.1 多因子策略4.1 基本面因子介绍4.1.1 成长类因子选股 indicator4.1.2 规模类因子选股 valuation4.1.3 价值类因子选股 valuation4.1.4 质量类因子选股 indicator 4.1 技术面因子介绍 5.2 市场中性策略5.3 套利策略5.4 指数增强策略5.5 CAT策略 6 高频交易HFT6.1 高频交易简介——速度的游戏6.2 高频交易案例

1 金融基础

金融工程:金融产品与衍生产品进行组合与分解、解决方案的设计、金融产品的定价与风险管理。

1.1 金融产品

5大金融产品:股票、债券、基金、期货、期权。 在这里插入图片描述

量化入门推荐做股票和ETF(风险低),不推荐直接做期货、期权(高风险)。

1.1.1 股票

本质:股票的本质是公司的部分所有权,属于权益类投资。股票是一种有价证券,有价证券除股票外,还包括国家债券、公司债券、不动产抵押债券等等。(低杠杆) 在这里插入图片描述 投资策略:持有股票要不断跟踪公司具体情况,公司近期经营情况、业绩情况、远期规划、战略目标、管理层的规划和执行等等,要像公司老板一样,对公司情况一清二楚。

股票策略非常多,相对而言,价值投资策略对普通人更容易一些,建议采取价值投资策略:在价格远远低于价值时再考虑买进并持有直到价格回归价值。

股票类别: ①按照上市的地点进行划分,可以分为a股,b股,h股,s股,n股。 a股(普通股票),被称为人民币普通股票,是指那些在中国大陆注册上市的股票,必须以人民币购买和交易的股票。 b股(特种股票),被称为人民币的特种股票,是指在中国大陆注册、上市的特种股票是以人民币来标明股票的面值,只能用外币认购和交易的股票。 h股(国企股),这种股票被称为国企股,指的是在香港上市的企业股票。 s股,是指那些的主要业务在中国大陆生产或者经营,但是企业的注册地在新加坡。 n股,是指那些的主要业务在中国大陆生产或者经营,但在纽约上市企业的股票。

②按照公司的业绩,可以分为绩优股,绩差股,蓝筹股,垃圾股。 绩优股:公司经营很好,业绩很好。 绩差股:公司经营不好,业绩不好。 蓝筹股:股票市场上,那些在其所属行业内占有重要支配性地位业绩优良,成交活跃、红利优厚的大公司股票。 垃圾股:经营亏损或违规的公司的股票。 在这里插入图片描述

·东方财富网分析股票:公司基本资料、财务数据、分析新闻公告及重大事项、行业分析、技术分析。

1.1.2 基金

本质:主动型基金的本质是专业的基金经理给你挑选的一篮子的(股票+债券+期货),被动型基金的本质是跟随某些指数,尽量完美复制指数走势。在这里插入图片描述 投资策略:基金是最适合一般投资者的类别(分散不容易爆雷),基金是由专业人士进行分析市场并操作的,但是基金不一定稳赚,主动型基金需要关注基金投资方向、内容、理念还有基金经理的历史和能力,被动型基金需要关注基金所跟随着指数的内容和趋势。 基金可以采取长期定投策略,设置定期投入一定金额的资金,长期投资。在低估值时定投沪深300、中证500,到高估值时卖出,长期来看有不错的收益,甚至能击败很多基金经理。

基金分类:主动型基金、被动型基金。

1.1.3 债券

本质:债券的本质是借钱给发债对象,属于固定收益类投资。但是个人投资者能直接购买的债券有限,大部分债券都是面对机构的,一般个人投资者只能通过机构间接的购买,例如债券型基金、通过ETF来购买债券。在这里插入图片描述 投资策略:债券策略建议参考美林时钟,分析宏观经济环境,在经济下行,通胀下行时债券表现更好,此时可以考虑投资债券型基金来间接投资债券。

从历史来看,债券与股票有一定负相关,有股债跷跷板现象,如果判断股票市场没有什么机会,或许债券市场是更好的选择,不过长期看来,股票能带来的年均回报率远高于债券,所以,大部分时间应该投资股票,某些特别的时期才考虑投资债券。

债券分类: 按发行主体划分:政府债券、金融债券、公司(企业 ) 债券; 按财产担保划分:抵押债券信用债券; 按债券形态分类:实物债券凭证式债券、信用债券; 按是否可转换划分:可转换债券、不可转换债券; 按付息的方式划分:零息债券、定息债券、浮息债券; 按能否提前偿还划分:可赎回债券、不可赎回债券 按债券是否记名分类:记名债券、不记名债券。

1.1.4 期货

本质:期货的本质是标准化合同,即在未来某一时间对某一品种进行指定成交数量和价格的合同,属于金融衍生品。(高杠杆) 在这里插入图片描述 投资策略:期货中最关键的是对未来商品价格的判断,在交割日期货价格会走向现货价格趋于一致(否则有套利空间,价差会被发现而被抹平)。某一商品价格变动最根本原因是供需关系,如果持有期货合约,要跟踪分析商品的供需情况,尤其需要对时间敏感,因为期货合约受时间影响很大。

期货有明确的成交时间,因此,不适合以年为单位持有同一份合约,如果到成交日期还未平仓,你是真的需要到实地去领商品或者卖商品的,否则违法会受到更大惩罚,所以如果做某个商品的品种,需要定期对同一个品种更换更新的一份合约。

非100%保证金的情况下,期货有爆仓风险(有的甚至还可能有穿仓风险,亏光而且还倒欠钱),在亏损达到一定程度时会触发强行平仓,因此,期货必须设置止损,必须防止因为特殊情况大波动而被强制平仓导致巨大亏损的情况。

期货与股票截然不同,股票里可以逆向投资,寻找便宜低估的公司。期货里一定要顺势而为,不能逆势,否则会遭遇重大亏损。股票有内在价值,内在价值源于公司,收益来源于分红和价差,期货只能投机,收益来源于买卖价差,是零和博弈(如果算上手续费,还是负和博弈)。

股票里可以不止损,只要公司确实是好公司,终究会价值回归,期货里一定要设置止损,否则一旦出错就会造成重大亏损

期货最好形成自己的交易系统,更注重对技术分析的运用,内含止损止盈、各种情况的概率,并且需要在实践中不断调整改善。

期货分类: 商品期货:农产品期货、金属期货、能源期货。 金融期货:股指期货。 利率期货:利率期货是指以债券类证券为标定物的期货合约,它可以避免利率波动所引起的证券价格变动的风险。 外汇期货:又称为货币期货,是一种在最终交易日按照当时的汇率将一种货币兑换成另外一种货币的期货合约。

1.1.5 期权

本质:期权与期货一样,本质是一种合约。期权买方 向 卖方支付一定代价后,有权在某一特定日期或该日之前的任何时间以固定价格购进或售出一种资产的权利。

简单的说,期权(选择权)就是使买方能获得权力,在某个日期或之前(美式期权)以某一价格买进或卖出相对应的资产。

相对的,期权合约的另一方,卖方, 在买方决定行使自己的权利时,有义务卖出或买进相对应的资产。买方为了这份期权合约将支付一定的费用,称作权益金(premium)。而卖方将收取这份费用。

投资策略: 保护性看跌期权:股票加看跌期权组合,是指购买1股股票,同时购买该股票的1股看跌期权。 抛补看涨期权:股票加空头看涨期权组合,是指购买1股股票,同时出售该股票的1股看涨期权。 多头对敲:是指同时买进一只股票的看涨期权和看跌期权,它们的执行价格、到期日都相同。 空头对敲:同时出售一只股票的看涨期权和看跌期权,它们的执行价格、到期日都相同。

1.1.6 ETF

交易型开放式指数证券投资基金ETF,跟踪“标的指数”变化、且在证券交易所上市交易的基金。投资人可以如买卖股票那么简单地去买卖“标的指数”的ETF,可以获得与该指数基本相同的报酬率。(低杠杆)

ETF通常由基金管理公司管理,基金资产为一篮子股票组合,组合中的股票种类与某一特定指数(如上证50指数)包含的成份股票相同,股票数量比例与该指数的成份股构成比例一致。

资产类型或运作模式不同,分为股票ETF、债券ETF、跨境ETF、商品ETF、交易型货币基金几类。

1.1.7 外汇

外汇 是货币行政当局以银行存款、财政部库券、长短期政府证券等形式保有的在国际收支逆差时可以使用的债权。包括外国货币、外币存款、外币有价证券(政府公债、国库券、公司债券、股票等)、外币支付凭证(票据、银行存款凭证、邮政储蓄凭证等)。

1.2 技术指标

K线图与技术指标的关系:将技术指标和K线图进行综合利用,利用历史数据,推测未来趋势,双向思考,作为分析的辅助工具。

1.2.1 K线 (日本蜡烛图)

每个蜡烛包含4个关键的价格:开盘价、收盘价、最高价、最低价。反映大势的状况和价格信息。如果把每日的K线图放在一张纸上,就能得到日K线图,同样也可画出周K线图、月K线图。

阳线:价格上涨↑(牛市)。 阴线:价格下跌↓(熊市)。 字线:开盘价=收盘价,价格未来反转的信号! 在这里插入图片描述

K线图的独到之处在于,利用单日的K线形态即可初步判断市场的强弱:

多方(多头):指看好股市而做多的一方,也就是看好而大量买股票推高股价的一方。多方有利=价格将涨。k线的实体部分越长,说明多头力量越强,后市上涨的概率越大。 空方(空头):就是对股市的未来不看好而卖出股票打压股票价格使得股票价格下挫的一方。空方有利=价格将跌。k线的实体部分越短,说明空头力量越强,后市下跌的的概率就越大。

高档是指股价的高位,一般指高价的集聚区。 低档是指股价的低位,一般是指低价的集聚区。

低挡超强(高档差低档佳):当股价调整到均线附近/前期整理平台/在价格较低的位置时,会遇到很强的支撑,股价会上涨。 高档换手(高档小心):当股价上升到一定高度是,成交量放大,换手率大增,股价很高了,小心随时卖出。这里有两种情况,一种是新庄换老庄,股价还会上涨,一种是散户换庄家,股价将下跌。 在这里插入图片描述

1.2.2 MA、SMA、WMA、EMA

①MA是移动平均线。

②SMA是简单移动平均线,简称均线。它是将某一段时间的收盘价之和除以该周期。比如日线MA5指5天内的收盘价除以5。 S M A ( n ) = c 1 + c 2 + . . . + c n n , ( c i 为第 i 天的收盘价 c l o s e ) SMA(n)=\frac{c_1+c_2+...+c_n}{n} , (c_i为第i天的收盘价close) SMA(n)=nc1​+c2​+...+cn​​,(ci​为第i天的收盘价close) 价格(K线)在SMA线之上是呈上升趋势,价格(K线)在SMA线之下是呈下降趋势,

投资者可以根据均线理论中多头排列、空头排列来判断股票未来的走势。根据一些重要的均线来寻找支撑点、压力点,或者买入点、卖出点。比如,当股价跌破5日均线时,短线投资者可以进行卖出操作;当股价向下跌触碰5日均线之后,出现反弹向上运行的迹象,投资者可以进行买入操作。

③WMA是加权移动平均线,离今天越近的收盘价越重要,所以权重越高。 S M A ( n ) = c 1 w 1 + c 2 w 2 . . . + c n w 3 , ( c i 为第 i 天的收盘价 c l o s e , w i 为第 i 天的权重 ) SMA(n)=\frac{c_1}{w_1} + \frac{c_2}{w_2} ...+\frac{c_n}{w_3}, (c_i为第i天的收盘价close, w_i为第i天的权重) SMA(n)=w1​c1​​+w2​c2​​...+w3​cn​​,(ci​为第i天的收盘价close,wi​为第i天的权重)

④EMA是指数平滑移动平均线 ⑤VAR适应性移动平均线

1.2.3 MACD指标和KDJ指标

MACD又称为指数平滑异同移动平均线,是从双移动平均线发展而来的。它是利用短期移动平均线(常用为12日)与长期移动平均线(常用为26日)之间的聚合与分离状况,对买进、卖出时机作出研判的技术指标。当MACD从负数转为正数,是买入的信号。当MACD从正数转为负数,是卖出的信号。当MACD以大角度变化,表示快的移动平均线和慢的移动平均线的差距迅速拉开,表达了一个市场大趋势的转变。   随机指标KDJ一般是用于股票分析的统计体系,根据统计学原理,通过一个特定的周期(常为9日、9周等)内出现过的最高价、最低价及最后一个计算周期的收盘价及这三者之间的比例关系,来计算最后一个计算周期的未成熟随机值RSV,然后根据平滑移动平均线的方法来计算K值、D值与J值,并绘成曲线图来研判股票走势。   当个股的MACD指标或者KDJ指标出现低位金叉时,投资者可以进行适当的买入操作;当MACD指标或者KDJ 指标出现高位死叉时,投资者可以进行适当的卖出操作。

1.2.4 BOLL指标

布林线BOLL指标,求出股价的标准差及其信赖区间,从而确定股价的波动范围及未来走势,利用波带显示股价的安全高低价位,因而也被称为布林带。其上下限范围不固定,随股价的滚动而变化。

BOLL指标中的上、中、下三条轨道比较重要,当股价从上轨的上方往下运行时,投资者可以进行抛出操作;当股价受到下轨的支撑,往上运行时,可以进行建仓操作,突破中轨时,可以进行适当的加仓操作。

1.3 金融模型

在这里插入图片描述

. .

2 量化交易简介

交易类型:每个人都有自己的交易风格(类型)。 在这里插入图片描述

量化交易:主要研究股票的客观交易(低杠杆)。 在这里插入图片描述 所谓量化交易,就是你总结一套股票规律(历史数据),把这套规律转化成程序可以执行的策略(模型),根据策略实现自动下单,在历史数据上进行回测优化,再在模拟盘进行回测优化,最后投入市场进行验证。在这里插入图片描述 量化交易 = 核心量化策略 + 交易系统开发 在这里插入图片描述 在这里插入图片描述

2.1 量化交易开发流程

1.数据获取 内容:行情数据、财务数据、宏观数据、舆情数据 方式:网站下载、三方API、客户端、爬虫

2.数据清洗 场景:垃圾数据清除、格式转换、空值填充、数据对齐 类库:numpy、pandas

3.策略编写(选股+择时) 信号捕捉->交易->建仓(买入)/平仓(卖出) 基本的检验策略方法有回测和模拟交易两种方法,回测是用历史数据模拟,模拟交易使用实际的实时行情来模拟执行策略的。

4.策略回测 回测是让计算机能根据一段时间的历史数据模拟执行该策略,根据结果评价并改进策略。 回测参数设置->策略实例化->历史数据载入->回测执行->计算盈亏->计算统计指标->生成回测报告

5.策略优化 重视交易费、重视风险及时退出、优化无止境。

6.模拟盘交易 模拟交易是让计算机能根据未来实际数据模拟执行该策略一段时间,根据结果评价并改进策略。 过去表现不代表未来结果(泛化性)、至少半年以上、收益至少100%以上再实盘。

7.实盘交易 实盘交易就是让计算机能自动根据实际行情,用真金白银自动执行策略,进行下单交易。 做好第一年会亏的准备、不要急于扩大投资(降低杠杆)。

量化交易平台介绍: 量化交易平台:可为量化交易研发人员提供所需的量化数据、策略框架回测框架、交易接口等功能,极大提高量化交易初学者的研发效率。常见有:聚宽、掘金量化、BigQuant、米花。我们选择聚宽平台进行量化开发。

聚宽(JoinQuant)量化交易平台:是为量化爱好者(宽客)量身打造的云平台,提供精准回测功能、高速实盘交易接口、易用的API文档、由易入难的策略库便于量化研发人员快速实现、使用自己的量化交易策略。

2.2 量化交易分类 2.2.1 按交易产品分类

在这里插入图片描述 1.股票策略盈利模式:股票是股份公司为筹集资金而发行给各个股东作为持股凭证,并借以取得股息和红利的一种有价证券。通过股价波动盈利(低买高卖)。

2.期权策略盈利模式:期权是一种选择权,是一种能在未来某特定时间以特定价格买卖一定数量的某种特定商品的权利。通过期权合约差价盈利(低买高卖)。

3.CTA策略盈利模式:期货是一种标准化合约,期货交易所统一制定的、约定在未来的某一个确定的日期和地点按照约定的条件买卖一定数量和质量的标的资产的标准化合约。关注价格趋势获取利差(期货与现货差价)。

4.FOF策略盈利模式:FOF基金中的基金,是一种专门投资于其他投资基金的基金。通过资产配置来分散风险、平滑波动、改善组合收益风险比,从而优化投资者的持有体验尤其是在震荡的市场背景下,FOF产品的优势尤其明显。

2.2.2 按盈利模式分类

在这里插入图片描述1.单边多空策略:股票低价买进,待股价出现高价单边下跌时卖出,赚取利差

2.套利策略:追求无风险套利,在金融市场利用某些金融产品价格与收益率暂时不一致的机会获得收益的策略。 在这里插入图片描述

3.对冲策略:对冲指特意减低另一项投资风险的投资。同时进行两笔行情相关、方向相反、数量相当、盈亏相抵的交易。对冲策略是在期货股票市场和股票市场同时进行等量反向交易,以锁定既得利润(或成本),通过抵消两个市场的损益来规避股票市场的系统性风险。做多的同时做空,市场向上时,赚钱; 市场向下时,赚钱或少亏钱。

2.2.3 按策略信号分类

量化策略:信号捕捉->交易->建仓(买入)/平仓(卖出) 在这里插入图片描述 策略信号:交易信号,买入或卖出的一系列特征。 在这里插入图片描述

1.多因子策略:找到某些和收益率最相关的多个指标,并根据该指标,建一个股票组合,期望该组合在未来的一段时间跑赢指数(做多/建仓/买入) 或 跑输指数(做空/平仓/卖出)。

2.交易模型:基于现代多学科众多理论,以及多种金融技术分析理论,具有普遍性,可盈利可量化可执行交易系统,市场趋势符合交易模型即可盈利。

3.机器学习:从大量数据中找到某种规律,包括但不局限于文本数据nlp、图像数据cv等,找到可盈利,可量化,可执行的策略信号。区别于传统金融量化策略,从更丰富的数据维度中识别策略信号。

2.3 股票投资 2.3.1 行业分类的作用

在这里插入图片描述 股价:股票的交易价格,与股票的价值是相对的概念。 股票价值:是企业资产价值。而股价的价值就等于每股收益乘以市盈率。

2.3.2 股价影响因素

经济因素:主要指经济周期因素,经济衰退,股价随之下跌;经济繁荣,股价也随之上涨。

政治因素:外交的改善会使有关跨国公司股价上升;战争使各国政治经济不稳,股价下跌,但会使军工行业股价上升。

行业因素:行业在国民经济中地位的变更,发展前景和发展潜力,新兴行业的冲击等都会影响相关股票的价格。

企业因素:企业的经营业绩水平、本身的资产信用、股息红利的设定外来的发展前景等等都可以影响该企业股票价格变动。

市场因素:主要指市场交易状况、其他金融投资产品的表现、交易因素、供求关系等因素。

2.3.3 量化名词解释

标的: 靶子,就是你买卖的对象,如股票、期货、期权等金融产品。

多头: 指买方,也就是看好某个股票(或者证券)未来走势,买入或者持有该股票的一方。

空头: 就是对某个股票未来行情走势看跌,卖出或者不看好该股票的一方。

建仓: 建仓一般是指初次买入,建仓通常在投资标的价格较低时进行。

平仓: 指将账户中的有价证券全部卖出,平仓的止盈策略,在高点卖出,平仓的止损策略,防止大盘继续下跌而卖出。

滑点: 指客户下单交易点位与实际交易点位有差别的现象。订单成交需要一定时间,当下单时,价格可能会发生变化,从而导致交易者以高于或低于预期的价格进行交易。

复权: 指对股价和成交量进行了权息修复后,开始绘制股票最真实股价变动的趋势图,同时还将成交量调到相同的股本口径。复权主要是分成了向前复权和向后复权。

指数: 是指一个选股的规则,它是按照某个规则挑选出一系列的股票,根据这些挑选出来的股票进行统计的结果。指数可以反映这些股票的平均走势。每一个指数都有一个指数点数,指数点数反映的是指数背后股票的平均股价。如上证指数和深证指数等。

指数基金: 指数基金是以特定指数为跟踪标的/股票,通过复制指数成份券追求与标的指数同步的收益率的基金。

指标: 指能用具体数据来体现的指标,以一定范围内线性变换的数据反映自然界或社会的状态。

交易时间:周一至周五(法定节假日除外)上午9:30~ 11:30 下午13:00~15:00 价格优先,时间优先。

竞价成交:上午9:15~ 9:25 开盘集合竞价(成交量最大的价格),上午9:30~ 11:30 下午13:00~ 14:57 连续竞价,下午14:57~15:00收盘集合竞价(成交量最大的价格)。

交易单位:报价单位股,交易单位手,100股=1手,股价变动单位最小为0.01元。

庄家与散户:庄家:能够影响金融证券市场行情的大户投资者散户;股市中投入股市资金量较小的个人投资者。

换手率:某段时期内的成交量/发行总股数,表征该股票交易的活跃程度,10~50%非常活跃,低于1%非常不活跃。

PE市盈率:(每股市场价格)/(每股税后利润),PE越高,该企业越被高估(泡沫越大); 反之,该企业越被低估。

2.3.4 财务知识

财报:ROE净资产收益率、净利润、营业利润率增长率、净利润增长率越高越好 在这里插入图片描述

2.3.5 选股

选股:通过某种手段方式,提供给投资者判断个股的依据,帮助投资者选定个股的方法,选股是股票投资的第一步。选股的好坏决定了能否赚到钱。

选股方法:基本面选股:基本面是通过分析一家上市公司在发展过程中所面临的外部因素(经济增长、财政政策、利率变化)以及自身因素(经营状况、行业地位、财务状况),来预测其未来的发展前景,并以此来判断该上市公司的股票是否值得买入。

股票估值:基本面分析的核心。 在这里插入图片描述 每股收益:越高越好,代表公司的盈利水平。 市盈率PE::同行业市盈率越低越好、14~30倍正常、大于30属于高估、50倍以上存在泡沫。 毛利率:越高越好、毛利率大于50%属于很不错的公司。 净资产收益率:代表公司盈利能力、ROE长期保持在20%以上就是白马股。 资产负债率:适中为好,最好在10%~40%,过高容易暴雷,过低发展保守。 净利润增速:代表公司未来成长能力,近3年平均增速在20%以上属于优质企业,大约50%属于成长股。

2.3.6 择时

择时:股票买入和卖出的时机。

择时方法:技术分析:从K线形态、成交量、均线、布林带、MACD与KDJ等技术指标出发分析,它们是反映股价变化的指标。 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述在这里插入图片描述

2.4 量化平台

做期货,学TB 做股票,学聚款 做定制化交易框架,学VNPY 在这里插入图片描述 在这里插入图片描述

2.5 量化投资(选股+择时)

对于股票市场,量化投资主要包括量化选股、量化择时、算法交易、股票组合配置、资金或仓位管理、风险控制等。

第一阶段:选股 选股的目标是从市场上所有可交易的股票中,选出股票组合(避免单股重仓),通常称为“股票池”,并可根据自己的操作周期或市场行情变化,不定时地调整该股票池,作为下一阶段择时或调仓的基础。

量化选股的依据可以是基本面选股(分析公司的外部/内部因素),也可以是技术面选股(利用各种理论/指标预测股价),或二者的结合。常用的量化选股模型举例如下:

1、多因子模型 多因子模型:采用一系列的“因子”作为选股标准,满足这些因子的股票将作为候选放入股票池,否则将被移出股票池。这些因子可以是一些基本面指标,如 PB、PE、EPS 增长率等,也可以是一些技术面指标,如动量、换手率、波动率等,或者是其它指标,如预期收益增长、分析师一致预期变化、宏观经济变量等。多因子模型相对来说比较稳定,因为在不同市场条件下,总有一些因子会发生作用。

2、板块轮动模型 板块轮动模型:一种被称作风格轮动,它是根据市场风格特征进行投资,比如有时市场偏好中小盘股,有时偏好大盘股,如果在风格转换的初期介入,则可以获得较大的超额收益;另一种被称作行业轮动,即由于经济周期的原因,总有一些行业先启动行情,另有一些(比如处于产业链上下游的)行业会跟随。在经济周期过程中,依次对这些轮动的行业进行配置,比单纯的买入持有策略有更好的效果。

3、一致性预期模型 一致性预期模型:指市场上的投资者可能会对某些信息产生一致的看法,比如大多数分析师看好某一只股票,可能这个股票在未来一段时间会上涨;如果大多数分析师看空某一只股票,可能这个股票在未来一段时间会下跌。一致性预期策略就是利用大多数分析师的看法来进行股票的买入卖出操作。

与此类似的思路还有基于股吧、论坛、新闻媒体等对特定股票提及的舆情热度或偏正面/负面的消息等作为依据。还有一种思路是反向操作,回避羊群效应(物极必反),避免在市场狂热时落入主力资金出货的陷阱。

4、资金流模型 资金流模型:其基本思想是根据主力资金的流向来判断股票的涨跌,如果资金持续流入,则股票应该会上涨,如果资金持续流出,则股票应该下跌。所以可将资金流入流出情况编制成指标,利用该指标来预测未来一段时间内股票的涨跌情况,作为选股依据。

例. 简单的 白马股选股策略(每隔refresh_rate天调整持仓,无择时策略)

# 一:筛选条件: # 1.总市值>50亿(市值较大的公司,流动性好,竞争力强) # 2.上市天数>750(抛开3年以内的次新) # 3.流通盘比例>95%(要全流通,避免解禁压力) # 4.销售毛利率>20%(毛利率要高) # 5.扣非净资产收益率>20%(ROE要高) # 二:排名条件: # 1.总市值从大到小排列 import datetime from jqdata import * ## 初始化函数,设定要操作的股票、基准等等 def initialize(context): # 设定沪深300作为基准 set_benchmark('000300.XSHG') # True为开启动态复权模式,使用真实价格交易 set_option('use_real_price', True) # 设定成交量比例 set_option('order_volume_ratio', 1) # 股票类交易手续费是:买入时佣金万分之三,卖出时佣金万分之三加千分之一印花税, 每笔交易佣金最低扣5块钱 set_order_cost(OrderCost(open_tax=0, close_tax=0.001, \ open_commission=0.0003, close_commission=0.0003,\ close_today_commission=0, min_commission=5), type='stock') # 持仓数量 g.stocknum = 20 # 交易日计时器 g.days = 0 # 调仓频率 g.refresh_rate = 100 # 运行函数 run_daily(trade, 'every_bar') ## 选股函数,返回股票列表 def check_stocks(context): # 设定查询条件 q = query( indicator.code, valuation.capitalization, indicator.roe, indicator.gross_profit_margin, ).filter( valuation.capitalization > 50,#1.总市值>50亿 valuation.circulating_market_cap > valuation.market_cap*0.95,#3.流通盘比例>95% indicator.gross_profit_margin > 20,#4.销售毛利率>20% indicator.roe > 20,#5.扣非净资产收益率>20% ).order_by( valuation.market_cap.desc() ).limit( 100 ) df = get_fundamentals(q, statDate=str(context.current_dt)[:4]) buylist = list(df['code']) #上市天数>750(抛开3年以内的次新) buylist = delect_stock(buylist, context.current_dt, 750) buylist = filter_paused_stock(buylist)[:20] return buylist # 过滤停牌股票 def filter_paused_stock(stock_list): current_data = get_current_data() return [stock for stock in stock_list if not current_data[stock].paused] #排除次新 def delect_stock(stocks,beginDate,n=180): #去除上市距beginDate不足6个月的股票 stockList = [] for stock in stocks: start_date = get_security_info(stock).start_date if start_date 继续持有->卖出)。 在这里插入图片描述 常见的趋势跟踪型策略有:短时移动均线交叉策略和长时移动均线交叉策略,均线多头排列和空头排列入场出场策略,MACD的DIFF和DEA线交叉策略等。如下图所示: 在这里插入图片描述

2、高抛低吸型 高抛低吸型:高抛低吸型策略适用于震荡行情——当价格走势在一定范围的交易区间(箱形整理)或价格通道(平行上升或下降通道)的上下轨之间波动时,反复地在下轨附近买入,在上轨附近卖出,赚取波段差价利润(下轨买入->上轨卖出->下轨买入->上轨卖出->…)。 在这里插入图片描述

常见的高抛低吸型策略一般通过震荡类技术指标,如KDJ、RSI、CCI等,来判断价格走势的超卖或超卖状态,或通过MACD红绿柱或量能指标与价格走势间的背离现象,来预测波动区间拐点的出现。如下图所示: 在这里插入图片描述

3、横盘突破型 横盘突破型:价格走势可能在一定区间范围内长时间震荡,总有一天或某一时刻走出该震荡区间,或者向上突破价格上轨(如吸筹阶段结束开始拉升),或者向下突破价格下轨(如主力出货完毕,或向下一目标价位跌落以寻找有效支撑),此时行情走势变得明朗。 横盘突破型策略就是要抓住这一突破震荡区间的时机果断开多或开空,以期用最有利价位和最小风险入场,获得后续利润(空仓或持仓等待机会->突破上轨则买入或平空/突破下轨则卖出或做空)。

在这里插入图片描述 常见的横盘突破策略包括布林带上下轨突破、高低价通道突破、Hans-123、四周法则等。如下图所示: 在这里插入图片描述

必须要强调的是,趋势跟踪型策略和高抛低吸型策略适用于完全不同的市场行情阶段——如果在单边趋势中做高抛低吸,或是在震荡行情中做趋势跟踪,则可能会造成很大亏损。 因此,对这二者的使用,最关键的是,第一要尽量准确地判断当前行情类型,第二是要时刻做好止损保护(止亏和止盈)。

此外,还有一些组合策略,先通过DMI、ATR等指标判断当前是单边牛市或熊市,还是震荡行情,然后相应地选用趋势跟踪型或高抛低吸型策略,从而得到更稳健的收益。

2.6 从量化角度重新认识指标

指标分类: 指标的作用不是一成不变的,要根据自己的理解和市场的行情,对指标进行改进。(这些指标已经是半个世纪以前的产物,因为利益相关,最先进指标并不会被公开,所以要结合自己的思考,不要当韭菜) 在这里插入图片描述 指标的编程实现: 从市场的角度,理解指标公式的含义与计算方法 -> 选择语言/平台(如下东方财富/python/TB/MC) -> 编码实现

指标的市场理解: MA:连续几天的收盘价平均值,移动平均线MA代表市场的平均持仓成本。K线收盘价在均线之上,往往是多头趋势,价格可能进一步走高;K线收盘价在均线之下,往往是空头趋势,价格可能进一步下跌。 在这里插入图片描述 MACD:反映市场价格的走势,正向MACD表示上行势头较强,而负向则表明下行势头较强。 在这里插入图片描述 KD: 在这里插入图片描述 RSI: 在这里插入图片描述

. .

3 股价分析基础(Numpy\Pandas\Matpolt)

数据样本格式: 在这里插入图片描述

3.1 股价分析指标

在这里插入图片描述

在这里插入图片描述 实战代码:

import numpy as np from unittest import TestCase class TestNumpyStock(TestCase): """ 读取指定列 numpy.loadtxt需要传入4个关键字参数: 1.fname是文件名,数据类型为字符串str; 2.delimiter是分隔符,数据类型为字符串str; 3.usecols是读取的列数,数据类型为元组tuple, 其中元素个数有多少个,则选出多少列; 4.unpack是是否解包,数据类型为布尔bool。 #""" def testReadFile(self): file_name = "./demo.csv" end_price, volumn = np.loadtxt( fname=file_name, delimiter=',', usecols=(2, 6), unpack=True ) print(end_price) print(volumn) # 计算最大值与最小值 def testMaxAndMin(self): file_name = "./demo.csv" high_price, low_price = np.loadtxt( fname=file_name, delimiter=',', usecols=(4, 5), unpack=True ) print("max_price = {}".format(high_price.max())) print("min_price = {}".format(low_price.min())) # 计算极差 # 计算股价近期最高价的最大值和最小值的差值 和 计算股价近期最低价的最大值和最小值的差值 def testPtp(self): file_name = "./demo.csv" high_price, low_price = np.loadtxt( fname=file_name, delimiter=',', usecols=(4, 5), unpack=True ) print("max - min of high price : {}".format(np.ptp(high_price))) print("max - min of low price : {}".format(np.ptp(low_price))) # 计算成交量加权平均价格 # 成交量加权平均价格,英文名VWAP(Volume-Weighted Average Price,成交量加权平均价格)是一个非常重要的经济学量,代表着金融资产的“平均”价格 def testAVG(self): file_name = "./demo.csv" end_price, volumn = np.loadtxt( fname=file_name, delimiter=',', usecols=(2, 6), unpack=True ) print("avg_price = {}".format(np.average(end_price))) # 成交量加权平均价格:成交量做为收盘价的权重 print("VWAP = {}".format(np.average(end_price, weights=volumn))) # 计算中位数 # 收盘价的中位数 def testMedian(self): file_name = "./demo.csv" end_price, volumn = np.loadtxt( fname=file_name, delimiter=',', usecols=(2, 6), unpack=True ) print("median = {}".format(np.median(end_price))) # 计算方差 # 收盘价的方差 def testVar(self): file_name = "./demo.csv" end_price, volumn = np.loadtxt( fname=file_name, delimiter=',', usecols=(2, 6), unpack=True ) print("var = {}".format(np.var(end_price))) print("var = {}".format(end_price.var())) # 计算股票对数收益率、年波动率及月波动率 # 波动率是对价格变动的一种度量,历史波动率可以根据历史价格数据计算得出。计算历史波动率时,需要用到对数收益率 # 年波动率等于对数收益率的标准差除以其均值,再乘以交易日的平方根,通常交易日取250天 # 月波动率等于对数收益率的标准差除以其均值,再乘以交易月的平方根。通常交易月取12月 def testVolatility(self): file_name = "./demo.csv" end_price, volumn = np.loadtxt( fname=file_name, delimiter=',', usecols=(2, 6), unpack=True ) # 对数收益率,diff取差 log_return = np.diff(np.log(end_price)) # 年波动率:对数收益率的std / 对数收益率的标准差的mean * 根号下250 annual_volatility = log_return.std() / log_return.mean() * np.sqrt(250) # 月波动率:对数收益率的std / 对数收益率的标准差的mean * 根号下12 monthly_volatility = log_return.std() / log_return.mean() * np.sqrt(12) print("log_return = {}".format(log_return)) print("annual_volatility = {}".format(annual_volatility)) print("monthly_volatility = {}".format(monthly_volatility)) 3.2 股价均线

numpy卷积:np.convolve(weights, end_price)[N - 1:-N + 1] 在这里插入图片描述 简单移动均线SMA:计算股价与等权重指示函数卷积的股价线。 指数移动均线EMA:根据时间把权重衰减的 股价权重卷积的股价线。

import numpy as np import matplotlib.pyplot as plt from unittest import TestCase class TestNumpyMA(TestCase): def testSMA(self): file_name = "./demo.csv" end_price = np.loadtxt( fname=file_name, delimiter=',', usecols=2, unpack=True ) print(end_price) N = 5 # 设置卷积核为1x5大小,权重全为0.2 weights = np.ones(N) / N print(weights) sma = np.convolve(weights, end_price)[N - 1:-N + 1] print(sma) plt.plot(sma, linewidth=5) plt.show() def testEXP(self): x = np.arange(5) y = np.arange(10) print("x", x) # exp 函数可以计算出每个数组元素的指数 print("y", y) print("""Exp x : {}""".format(np.exp(x))) print("""Exp y : {}""".format(np.exp(y))) print("""Linespace : {}""".format(np.linspace(-1, 0, 5))) def testEMA(self): file_name = "./demo.csv" end_price = np.loadtxt( fname=file_name, delimiter=',', usecols=(2), unpack=True ) print(end_price) N = 5 # 线性衰减weight weighs = np.exp(np.linspace(-1, 0, N)) # 归一化 weighs /= weighs.sum() print(weighs) ema = np.convolve(weighs, end_price)[N - 1:-N + 1] print(ema) t = np.arange(N - 1, len(end_price)) plt.plot(t, end_price[N - 1:], lw=1.0) plt.plot(t, ema, lw=2.0) plt.show() 3.3 股票时间序列

时间序列:股价、汇率等数据的时间序列数据。 趋势分析:分析某时间序列在某一方向上持续运动,构建时间序列模型,预测未来股价变化,并阐述交易信号。 序列相关性:以投资品的收益序列为例,我们会观察到一段时间的收益率之间存在正相关或负相关,即收益率与时间相关。

pandas时间序列函数:

datetime():方便各种时间类型运算。 loc():对DtaeFrame进行筛选的函数,相当于SQL的select where。 groupby():对数据分组函数,相当于SSQL的GroupBy。

DataFrame:pands的基本类型DataFrame是一个csv表格的类,包含行索引index和列索引colums。pd.read_csv读入的就是一个DataFrame对象。 在这里插入图片描述

import numpy as np # 实例化 df = pd.DataFrame(np.arange(12).reshape(3,4),columns = list('甲乙丙丁'), index = ["one","two","three"]) # 转置 df.T # 取行索引index:即每行名称 df.index # 取列索引colums:即每列名称 df.columns # 删除列 del df["甲"] # 增加列 df["戊"] = np.arange(3) # 增加four行 df.loc["four"] = [1,2,3,4]

代码实战:

import matplotlib.pyplot as plt import pandas as pd from unittest import TestCase class TestPandasStock(TestCase): # 读取文件 def testReadFile(self): file_name = "./demo.csv" df = pd.read_csv(file_name) print(df.info()) print("-------------") print(df.describe()) # 时间处理 def testTime(self): file_name = "./demo.csv" df = pd.read_csv(file_name) df.columns = ["stock_id", "date", "close", "open", "high", "low", "volume"] df["date"] = pd.to_datetime(df["date"]) df["year"] = df["date"].dt.year df["month"] = df["date"].dt.month print(df) # 最低收盘价 def testCloseMin(self): file_name = "./demo.csv" df = pd.read_csv(file_name) df.columns = ["stock_id", "date", "close", "open", "high", "low", "volume"] print("""close min : {}""".format(df["close"].min())) print("""close min index : {}""".format(df["close"].idxmin())) print("""close min frame : {}""".format(df.loc[df["close"].idxmin()])) # 每月平均收盘价与开盘价 def testMean(self): file_name = "./demo.csv" df = pd.read_csv(file_name) df.columns = ["stock_id", "date", "close", "open", "high", "low", "volume"] df["date"] = pd.to_datetime(df["date"]) df["month"] = df["date"].dt.month print("""month close mean : {}""".format(df.groupby("month")["close"].mean())) print("""month open mean : {}""".format(df.groupby("month")["open"].mean())) # 计算涨跌幅 # 涨跌幅今日收盘价减去昨日收盘价 def testRipples_ratio(self): file_name = "./demo.csv" df = pd.read_csv(file_name) df.columns = ["stock_id", "date", "close", "open", "high", "low", "volume"] df["date"] = pd.to_datetime(df["date"]) df["rise"] = df["close"].diff() df["rise_ratio"] = df["rise"] / df.shift(-1)["close"] print(df) # 计算股价移动平均 def testMA(self): file_name = "./demo.csv" df = pd.read_csv(file_name) df.columns = ["stock_id", "date", "close", "open", "high", "low", "volume"] df['ma_5'] = df.close.rolling(window=5).mean() df['ma_10'] = df.close.rolling(window=10).mean() df = df.fillna(0) print(df) 3.4 K线图

在这里插入图片描述 使用matplotlib和mpl_finance库绘制K线图。 在这里插入图片描述

import matplotlib.pyplot as plt import pandas as pd from mpl_finance import candlestick2_ochl import mplfinance as mpf from unittest import TestCase class TestPandasKline(TestCase): # 读取股票数据,画出K线图 def testKLineChart(self): file_name = "./demo.csv" df = pd.read_csv(file_name) df.columns = ["stock_id", "date", "close", "open", "high", "low", "volume"] fig = plt.figure() axes = fig.add_subplot(111) candlestick2_ochl(ax=axes, opens=df["open"].values, closes=df["close"].values, highs=df["high"].values, lows=df["low"].values, width=0.75, colorup='red', colordown='green') plt.xticks(range(len(df.index.values)), df.index.values, rotation=30) axes.grid(True) plt.title("K-Line") plt.show() # K线图带交易量 def testKLineByVolume(self): file_name = "./demo.csv" df = pd.read_csv(file_name) df.columns = ["stock_id", "date", "close", "open", "high", "low", "volume"] df = df[["date", "close", "open", "high", "low", "volume"]] df["date"] = pd.to_datetime(df["date"]) df = df.set_index('date') my_color = mpf.make_marketcolors( up='red', down='green', wick='i', volume={'up': 'red', 'down': 'green'}, ohlc='i' ) my_style = mpf.make_mpf_style( marketcolors=my_color, gridaxis='both', gridstyle='-.', rc={'font.family': 'STSong'} ) mpf.plot( df, type='candle', title='K-LineByVolume', ylabel='price', style=my_style, show_nontrading=False, volume=True, ylabel_lower='volume', datetime_format='%Y-%m-%d', xrotation=45, linecolor='#00ff00', tight_layout=False ) # K线图带交易量及均线 def testKLineByMA(self): file_name = "./demo.csv" df = pd.read_csv(file_name) df.columns = ["stock_id", "date", "close", "open", "high", "low", "volume"] df = df[["date", "close", "open", "high", "low", "volume"]] df["date"] = pd.to_datetime(df["date"]) df = df.set_index('date') my_color = mpf.make_marketcolors( up='red', down='green', wick='i', volume={'up': 'red', 'down': 'green'}, ohlc='i' ) my_style = mpf.make_mpf_style( marketcolors=my_color, gridaxis='both', gridstyle='-.', rc={'font.family': 'STSong'} ) mpf.plot( df, type='candle', mav=[5, 10], title='K-LineByVolume', ylabel='price', style=my_style, show_nontrading=False, volume=True, ylabel_lower='volume', datetime_format='%Y-%m-%d', xrotation=45, linecolor='#00ff00', tight_layout=False ) 3.5 MACD

在这里插入图片描述 异同移动平均线 MACD 算法: 在这里插入图片描述 MACD实现使用的pandas函数: 在这里插入图片描述 代码实战: 在这里插入图片描述

import pandas as pd import matplotlib.pyplot as plt from unittest import TestCase class TestMACD(TestCase): # 计算MACD def cal_macd(self, df, fastperiod=12, slowperiod=26, signalperiod=9): ewma12 = df['close'].ewm(span=fastperiod, adjust=False).mean() ewma26 = df['close'].ewm(span=slowperiod, adjust=False).mean() df['dif'] = ewma12 - ewma26 df['dea'] = df['dif'].ewm(span=signalperiod, adjust=False).mean() df['bar'] = (df['dif'] - df['dea']) * 2 return df # 画图 def test_MACD(self): file_name = "./demo.csv" df = pd.read_csv(file_name) df.columns = ["stock_id", "date", "close", "open", "high", "low", "volume"] df = df[["date", "close", "open", "high", "low", "volume"]] df["date"] = pd.to_datetime(df["date"]) df_macd = self.cal_macd(df) print(df_macd) plt.figure() df_macd['dea'].plot(color="red", label='dea') df_macd['dif'].plot(color="blue", label='dif') plt.legend(loc='best') pos_bar = [] pos_index = [] neg_bar = [] neg_index = [] for index, row in df_macd.iterrows(): if (row['bar'] > 0): pos_bar.append(row['bar']) pos_index.append(index) else: neg_bar.append(row['bar']) neg_index.append(index) # 大于0用红色表示 plt.bar(pos_index, pos_bar, width=0.5, color='red') # 小于等于0则用绿色表示 plt.bar(neg_index, neg_bar, width=0.5, color='green') major_index = df_macd.index[df_macd.index] major_xtics = df_macd['date'][df_macd.index] plt.xticks(major_index, major_xtics) plt.setp(plt.gca().get_xticklabels(), rotation=30) plt.grid(linestyle='-.') plt.title('000001平安银行MACD图') plt.rcParams['axes.unicode_minus'] = False plt.rcParams['font.sans-serif'] = ['SimHei'] plt.show() 3.6 KDJ指数

在这里插入图片描述 K、D、J算法实现: 在这里插入图片描述 KDJ实现使用的pandas函数: 在这里插入图片描述 在这里插入图片描述

import pandas as pd import matplotlib.pyplot as plt from unittest import TestCase class TestKDJ(TestCase): def cal_kdj(self, df): # 计算ln low_list = df['low'].rolling(9, min_periods=9).min() low_list.fillna(value=df['low'].expanding().min(), inplace=True) # 计算hn high_list = df['high'].rolling(9, min_periods=9).max() high_list.fillna(value=df['high'].expanding().max(), inplace=True) rsv = (df['close'] - low_list) / (high_list - low_list) * 100 df['k'] = pd.DataFrame(rsv).ewm(com=2).mean() df['d'] = df['k'].ewm(com=2).mean() df['j'] = 3 * df['k'] - 2 * df['d'] return df def test_KDJ(self): file_name = "./demo.csv" df = pd.read_csv(file_name) df.columns = ["stock_id", "date", "close", "open", "high", "low", "volume"] df = df[["date", "close", "open", "high", "low", "volume"]] df["date"] = pd.to_datetime(df["date"]) df_kdj = self.cal_kdj(df) print(df_kdj) plt.figure() df_kdj['k'].plot(color="red", label='k') df_kdj['d'].plot(color="yellow", label='d') df_kdj['j'].plot(color="blue", label='j') plt.legend(loc='best') major_index = df_kdj.index[df_kdj.index] major_xtics = df_kdj['date'][df_kdj.index] plt.xticks(major_index, major_xtics) plt.setp(plt.gca().get_xticklabels(), rotation=30) plt.grid(linestyle='-.') plt.title('000001平安银行KDJ图') plt.rcParams['axes.unicode_minus'] = False plt.rcParams['font.sans-serif'] = ['SimHei'] plt.show() def testBoll(self): import numpy as np from matplotlib.pyplot import plot from matplotlib.pyplot import show # 绘制布林带 N = 5 weights = np.ones(N) / N print("Weights", weights) c = np.loadtxt('demo.csv', delimiter=',', usecols=(2,), unpack=True) sma = np.convolve(weights, c)[N - 1:-N + 1] deviation = [] C = len(c) for i in range(N - 1, C): if i + N


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有